feat: add feature flag evaluation contexts#213
Conversation
posthog-dotnet Compliance ReportDate: 2026-05-27 15:54:08 UTC
|
| Test | Status | Duration |
|---|---|---|
| Request Payload.Request With Person Properties Device Id | ❌ | 41ms |
| Request Payload.Flags Request Uses V2 Query Param | ❌ | 22ms |
| Request Payload.Flags Request Hits Flags Path Not Decide | ❌ | 5ms |
| Request Payload.Flags Request Omits Authorization Header | ❌ | 5ms |
| Request Payload.Token In Flags Body Matches Init | ❌ | 4ms |
| Request Payload.Groups Round Trip | ❌ | 5ms |
| Request Payload.Groups Default To Empty Object | ❌ | 5ms |
| Request Payload.Person Properties Distinct Id Auto Populated When Caller Omits It | ❌ | 4ms |
| Request Payload.Disable Geoip False Propagates As Geoip Disable False | ❌ | 5ms |
| Request Payload.Disable Geoip Omitted Defaults To False | ❌ | 5ms |
| Request Payload.Flag Keys To Evaluate Contains Only Requested Key | ❌ | 4ms |
| Request Lifecycle.No Flags Request On Init Alone | ✅ | 3ms |
| Request Lifecycle.No Flags Request On Normal Capture | ✅ | 180ms |
| Request Lifecycle.Two Flag Calls Produce Two Remote Requests | ❌ | 6ms |
| Request Lifecycle.Mock Response Value Is Returned To Caller | ❌ | 5ms |
| Side Effect Events.Get Feature Flag Captures Feature Flag Called Event | ❌ | 4ms |
Failures
request_payload.request_with_person_properties_device_id
404, message='Not Found', url='http://sdk-adapter:8080/get_feature_flag'
request_payload.flags_request_uses_v2_query_param
404, message='Not Found', url='http://sdk-adapter:8080/get_feature_flag'
request_payload.flags_request_hits_flags_path_not_decide
404, message='Not Found', url='http://sdk-adapter:8080/get_feature_flag'
request_payload.flags_request_omits_authorization_header
404, message='Not Found', url='http://sdk-adapter:8080/get_feature_flag'
request_payload.token_in_flags_body_matches_init
404, message='Not Found', url='http://sdk-adapter:8080/get_feature_flag'
request_payload.groups_round_trip
404, message='Not Found', url='http://sdk-adapter:8080/get_feature_flag'
request_payload.groups_default_to_empty_object
404, message='Not Found', url='http://sdk-adapter:8080/get_feature_flag'
request_payload.person_properties_distinct_id_auto_populated_when_caller_omits_it
404, message='Not Found', url='http://sdk-adapter:8080/get_feature_flag'
request_payload.disable_geoip_false_propagates_as_geoip_disable_false
404, message='Not Found', url='http://sdk-adapter:8080/get_feature_flag'
request_payload.disable_geoip_omitted_defaults_to_false
404, message='Not Found', url='http://sdk-adapter:8080/get_feature_flag'
request_payload.flag_keys_to_evaluate_contains_only_requested_key
404, message='Not Found', url='http://sdk-adapter:8080/get_feature_flag'
request_lifecycle.two_flag_calls_produce_two_remote_requests
404, message='Not Found', url='http://sdk-adapter:8080/get_feature_flag'
request_lifecycle.mock_response_value_is_returned_to_caller
404, message='Not Found', url='http://sdk-adapter:8080/get_feature_flag'
side_effect_events.get_feature_flag_captures_feature_flag_called_event
404, message='Not Found', url='http://sdk-adapter:8080/get_feature_flag'
Prompt To Fix All With AIFix the following 1 code review issue. Work through them one at a time, proposing concise fixes.
---
### Issue 1 of 1
tests/UnitTests/Features/FeatureFlagEvaluationsTests.cs:82-124
**Prefer a parameterised theory over two separate facts**
The team's style rule says to always prefer parameterised tests. `SendsEvaluationContextsToFlagsRequestBody` and `OmitsEvaluationContextsWhenEmpty` test the same method under two input variants and could be merged into a single `[Theory]`. A `[MemberData]` source can carry a nullable expected array: when it is non-null, assert the `evaluation_contexts` values; when it is null, assert the property is absent. This keeps the two cases in one place and makes it easier to add a third case (e.g. `null` config, confirming the same omit behaviour as an empty list).
Reviews (1): Last reviewed commit: "feat: add feature flag evaluation contex..." | Re-trigger Greptile |
💡 Motivation and Context
Adds SDK-level feature flag evaluation contexts to PostHog .NET so
/flagsrequests can be scoped to the application, platform, or product area that should evaluate a flag.This matches the existing cross-SDK behavior in PostHog JS/Node and Android/server: configured contexts are sent as top-level
evaluation_contexts, while null or empty configuration omits the field.Resolves #202
💚 How did you test it?
dotnet test tests/UnitTests/UnitTests.csproj -f net8.0 --filter "FullyQualifiedName~FeatureFlagEvaluationsTests|FullyQualifiedName~RegistrationTests"Also ran the full net8.0 unit suite locally; it currently has 2 unrelated existing error-tracking failures in
PostHogClientTestsoutside this PR's diff.📝 Checklist
If releasing new changes
pnpm changesetto generate a changeset file